#include "/home/zhong/muduo/muduo/net/TcpServer.h" // 我的muduo库放在~目录下了
#include "/home/zhong/muduo/muduo/net/EventLoop.h"
#include "/home/zhong/muduo/muduo/net/TcpConnection.h"
#include <iostream>
#include<string>
#include<unordered_map>

class TranslateServer
{
private:
    void InitDictMap()
    {
        // 也可以用文件读取，具体代码在：https://gitee.com/deep-coffee-brother/linux_code/blob/master/tcp_task_server/translate.hpp
        _dict_map.insert(std::make_pair("apple", "苹果"));
        _dict_map.insert(std::make_pair("happy", "开心"));
        _dict_map.insert(std::make_pair("hello", "你好"));
    }
    std::string Translate(const std::string str)
    {
        auto it = _dict_map.find(str);
        if(it!=_dict_map.end())
        {
            return it->second;
        }
        else
        {
            return "no find this word Chinese meaning";
        }
    }
    // 注意这里的类内成员函数参数会多一个this
    void OnConnection(const muduo::net::TcpConnectionPtr &conn) // 链接建立时发生的回调函数
    {
        if (conn->connected() == true)
        {
            std::cout << "新链接建立成功" << std::endl;
        }
        else
        {
            std::cout << "connection failed" << std::endl;
        }
    }
    void OnMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buff, muduo::Timestamp) // 事件发生时进行处理的回调函数
    {
        // 1.将字典初始化
        InitDictMap();  
        // 2.从buffer中获取数据
        std::string English = buff->retrieveAllAsString();

        // English = English.substr(0, English.size()-2);  // 这里是因为我用telnet测试，会有\r\n，需要截取掉
        // 3.进行业务处理
        std::string Chinese = Translate(English);
        // 4.向客户端发送数据
        conn->send(Chinese);
    }

public:
    TranslateServer(int port)
        : _server(&_base_loop, muduo::net::InetAddress("0.0.0.0", port), "Translater", muduo::net::TcpServer::kReusePort)
    {
        // 防止类内函数的this指针影响TcpServer类！
        auto OnConnection = std::bind(&TranslateServer::OnConnection, this, std::placeholders::_1);
        _server.setConnectionCallback(OnConnection);

        auto OnMessage = std::bind(&TranslateServer::OnMessage, this, std::placeholders::_1, std::placeholders::_2,std::placeholders::_3);
        _server.setMessageCallback(OnMessage);

        
    }

    // 服务器启动
    void start()
    {
        // 进行listen客户端链接
        _server.start();
        // Reactor设计模式下进行epoll的监控
        _base_loop.loop();
    }

private:
    muduo::net::TcpServer _server;
    muduo::net::EventLoop _base_loop;

    std::unordered_map<std::string, std::string> _dict_map;
};
int main()
{
    std::unique_ptr<TranslateServer> ts = std::make_unique<TranslateServer>(8080);
    ts->start();
}